# 导入 Pillow 库中的 Image 类
from PIL import Image
import os
 
# 定义字符集合
ascii_char = list("$@B%8&W#*oahkbdpqwmZO0QLCJYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
 
# 将 RGB 值转换为 ASCII 字符
def get_char(r, g, b, alpha=256):
    # 如果 alpha 值为 0，则返回一个空格
    if alpha == 0:
        return ' '
    # 计算灰度值
    gray = int(0.2126*r + 0.7152*g + 0.0722*b)
    # 将灰度值映射到字符集合的区间内，获得相应的字符，并返回该字符
    return ascii_char[int(gray/256*len(ascii_char))]

class MyClass:
    def __init__(self):
            self.image_path = 'D:\PythonCode\haha.png'

    def main(self):
        try:
            #  将图片转换为ASCII字符
            with Image.open(self.image_path) as im:
                # 获取原图的高度与宽度
                width, height = im.size
                # 原图的高宽之比
                t = width/height
                # 设置转换出的字符图的高度,设置的值越小,转换出的字符图就越小,细节程度也低,该值不建议太大也不建议太小,介于50-200之间的整数即可
                # 这里我根据图片的高度来确定字符图的高度
                char_height = int(height/2)
                char_width = int(char_height*t*2)  # 通过图片高宽比例计算字符图的宽度,乘2是因为转换后宽度被压缩为原来的1/2
                # 将图片转换为单通道灰度图并调整为字符图的大小
                im = im.convert('L').resize((char_width, char_height))
                # 将像素映射为ASCII字符
                char_lst = ['@', '#', '8', 'M', '&', 'N', '9', 'H', 'Q', '4', 's', 'r','1', 'i', '*', ';', '~', ':', ',', '.', ' ']
                result = ''
                for j in range(im.size[1]):
                    for i in range(im.size[0]):
                        gray = im.getpixel((i, j))
                        idx = int(gray / (256 / len(char_lst)))
                        result += char_lst[idx]
                    result += '\n'

            if result:
                # 根据图片名称将字符保存到文件
                file_path, ext = os.path.splitext(self.image_path)
                filename = 'haha.txt'
                file_path = os.path.join('./data', filename)
                with open(file_path, 'w') as f:
                    f.write(result)

                self.update_progress.emit(100)  # 发送完成进度信号
            else:
                self.update_progress.emit(0)  # 发送失败进度信号
        except:
            self.update_progress.emit(0)  # 发送失败进度信号
 
# 判断该文件是否为主程序
if __name__ == '__main__':
    obj = MyClass()
    obj.main()